﻿Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO

''' <summary>
''' Implémentation abstraite des fonctionalités de base de IListeChampsSortieTable.
''' </summary>
''' <remarks></remarks>
Public MustInherit Class baseListeChampsSortieTable
    Inherits baseListeChampsSortie
    Implements IListeChampsSortieTable

    Protected _paramInitialisation As Object
    Protected _initHasBeenMade As Boolean = False
    Protected _savedCorresp As Correspondance

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        _paramInitialisation = Nothing
        _initHasBeenMade = False
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New(ByVal paramInitialisation As Object)
        '_traitementTableBDD = tableBDD
        _paramInitialisation = paramInitialisation
        _initHasBeenMade = False
    End Sub

#Region "Modification de la collection de champs"
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub rename(ByVal cleItemArenommer As String, ByVal nouvelleCle As String) Implements IListeChampsSortieTable.rename
        Add(nouvelleCle, Item(cleItemArenommer))
        Remove(cleItemArenommer)
        Item(nouvelleCle).description = nouvelleCle
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Function setCaracteristiques(ByVal descrCorrespSortie As String, ByVal chSortie As ChampsBDD) As Boolean Implements IListeChampsSortieTable.setCaracteristiques
        Return Item(descrCorrespSortie).setChSortie(chSortie)
    End Function
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Function setDescription(ByVal descrCorrespSortie As String, ByVal nouvelleDescr As String) As Object Implements IListeChampsSortieTable.setDescription
        rename(descrCorrespSortie, nouvelleDescr)
        Return True
    End Function
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Function setFormatAff(ByVal descrCorrespSortie As String, ByVal formatAff As String) As Object Implements IListeChampsSortieTable.setFormatAff
        Item(descrCorrespSortie).chOutil.Format.formatAff = formatAff
        Return True
    End Function
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Function setFormuleEgaleCste(ByVal chEntree As ChampsBDD, ByVal descrCorrespSortie As String) As Boolean Implements IListeChampsSortieTable.setFormuleEgaleCste
        'Supprimer les dépendances constitutives
        Item(descrCorrespSortie).setChEntree(chEntree)
        Item(descrCorrespSortie).typeChEntree = typeChEntreeMapping.CONSTANT
        Return True
    End Function
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Function setFormuleEgaleNothing(ByVal descCorrespSortie As Object) As Boolean Implements IListeChampsSortieTable.setFormuleEgaleNothing
        'Mettre à jour les correspondances constitutives
        Return Item(descCorrespSortie).setChEntree(Nothing)
    End Function
#End Region

#Region "Sauvegarde / chargement de la collection de champs"

    ''' <summary>
    ''' Récupération en mémoire temporaire d'une correspondance
    ''' </summary>
    ''' <param name="nomCorresp"></param>
    ''' <remarks></remarks>
    Public Sub loadCorresp(ByVal nomCorresp As String) Implements IListeChampsSortieTable.loadCorresp
        Item(nomCorresp) = _savedCorresp
    End Sub
    ''' <summary>
    ''' Mise en mémoire temporaire d'une correspondance
    ''' </summary>
    ''' <param name="nomCorresp"></param>
    ''' <remarks></remarks>
    Public Sub saveCorresp(ByVal nomCorresp As String) Implements IListeChampsSortieTable.saveCorresp
        _savedCorresp = Item(nomCorresp).copy()
    End Sub

    ''' <summary>
    ''' Sauvegarde de la collection de champs
    ''' </summary>
    ''' <param name="nomCompletFichier"></param>
    ''' <remarks></remarks>
    Public Sub save(ByVal nomCompletFichier As String) Implements IListeChampsSortieTable.save
        'Sauvegarde de la liste de champs
        Dim myFileStream As IO.Stream = IO.File.Create(nomCompletFichier, FileMode.Create)
        Dim serializer As New BinaryFormatter
        Try
            serializer.Serialize(myFileStream, Me.copyDictionary)
        Catch e As SerializationException
            MsgBox("Echec de la serialization. Cause : " & e.Message)
        Finally
            myFileStream.Close()
        End Try
    End Sub
    ''' <summary>
    ''' Clonage du dictionaire de champs
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function copyDictionary() As IDictionary(Of String, Correspondance) Implements IListeChampsSortieTable.copyDictionary
        Dim result As New ObservableDictionary(Of String, Correspondance)
        For Each corresp As Correspondance In Values
            result.Add(corresp.description, corresp.copy)
        Next
        Return result
    End Function

    ''' <summary>
    ''' Chargement d'une liste de champs en sortie dans une tableBDD
    ''' </summary>
    ''' <param name="nomCompletFichierMapACharger"></param>
    ''' <param name="tble_BDDAMAJ"></param>
    ''' <remarks>Cette méthode permet, une fois un mapping en entrée renseigné et un mapping en sortie
    ''' initialisé, de faire une correspondance entre les champs en entrée et en sortie</remarks>
    Public Shared Sub load(ByVal nomCompletFichierMapACharger As String, ByVal tble_BDDAMAJ As tableBDD)

        Try

            Dim ListeChampsSortieLoad As IDictionary(Of String, Correspondance) = Nothing
            If tble_BDDAMAJ Is Nothing Then
                MsgBox("Vous devez importer un fichier d'encours avant de lui appliquer un mapping", MsgBoxStyle.Exclamation)
                Exit Sub
            End If
            Dim ListeChampsSortieAMAJ As baseListeChampsSortieTable = tble_BDDAMAJ.ListeChampsSortie
            Dim b As Boolean = True

            'Déserialization de la collection
            If File.Exists(nomCompletFichierMapACharger) Then

                'Récupération du contenu du fichier dans un objet Mapping
                Dim myFileStream As Stream = File.OpenRead(nomCompletFichierMapACharger)
                Dim deserializer As New BinaryFormatter()
                ListeChampsSortieLoad = CType(deserializer.Deserialize(myFileStream), IDictionary(Of String, Correspondance))
                myFileStream.Close()

                For Each corresp In ListeChampsSortieLoad
                    'On vérifie que la correspondance chargée contient un champs source et un champs cible
                    If Not corresp.Value.chBDD Is Nothing And Not corresp.Value.chOutil Is Nothing Then

                        'On vérifie :
                        '   - que l'identifiant de la correspondance chargée correspond à un identifiant
                        '     présent dans le mapping de la table à mettre à jour
                        '   - que les formats en sortie de la correspondance chargée et 
                        '     de la correspondance à mettre à jour sont identiques
                        '   - que le champs en entrée de la correspondance chargée est bien présent dans 
                        '     la table à mettre à jour
                        'Si ces vérifications s'avèrent concluantes, on remplace la correspondance
                        'portant le même descriptif par la correspondance chargée.
                        For Each correspAMaj In ListeChampsSortieAMAJ
                            If correspAMaj.Key = corresp.Key Then
                                If correspAMaj.Value.estSerializeCompatible(corresp.Value) Then
                                    If tble_BDDAMAJ.ListeChampsEntree.ContainsKey(corresp.Value.chBDD.Nom) _
                                    Or corresp.Value.typeChEntree = typeChEntreeMapping.CONSTANT Then
                                        correspAMaj.Value.setChEntree(corresp.Value.chBDD)
                                        correspAMaj.Value.typeChEntree = corresp.Value.typeChEntree
                                        correspAMaj.Value.MAJ_EtatCorresp()
                                    End If
                                End If
                            End If
                        Next

                    End If
                Next

            End If
        Catch ex As Exception
            MsgBox("Le fichier que vous tentez de charger est endommagé")
        End Try

    End Sub

#End Region

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Function getChampsSortie() As System.Collections.Generic.List(Of ChampsBDD) Implements IListeChampsSortieTable.getChampsSortie
        Dim result As List(Of ChampsBDD) = New List(Of ChampsBDD)
        For Each corresp As Correspondance In Values
            result.Add(corresp.chOutil)
        Next
        Return result
    End Function
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub valCorrespChanged(ByVal correspDefautModifiee As Correspondance) Implements IListeChampsSortieTable.valCorrespChanged
        If Not correspDefautModifiee Is Nothing Then

            For Each corresp As Correspondance In Values

                If Not corresp.chBDD Is Nothing And Not corresp.chOutil Is Nothing Then

                    If corresp.chBDD.Nom = correspDefautModifiee.chBDD.Nom And _
                       corresp.chOutil.Format.typeStock.Name = correspDefautModifiee.chOutil.Format.typeStock.Name And _
                       corresp.informat.nom = correspDefautModifiee.informat.nom Then
                        corresp.chOutil.valeursDistinctes = correspDefautModifiee.chOutil.valeursDistinctes
                    End If

                    If corresp.chBDD.Nom = correspDefautModifiee.chBDD.Nom And _
                       corresp.informat.nom = "-" And _
                       correspDefautModifiee.informat.nom = "-" Then
                        corresp.chOutil.valeursDistinctes = correspDefautModifiee.chOutil.valeursDistinctes
                    End If

                End If


            Next

        End If

    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Public MustOverride Function initialise(ByVal sender As Object) As Boolean Implements IListeChampsSortieTable.initialise

End Class
